home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / buttons / btndmo / cbuttons.cls < prev    next >
Text File  |  1995-10-01  |  11KB  |  354 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "CButtons"
  6. Attribute VB_Creatable = True
  7. Attribute VB_Exposed = False
  8. Option Explicit
  9.  
  10. 'Maximum number of buttons allowed per container
  11. Const MAX_BUTTONS = 50
  12.  
  13. 'The size of the bitmap; both height and width
  14. Const BTN_SIZE = 195    'Twips
  15.  
  16. 'Minimum space between buttons; no overlapping allowed
  17. Const MIN_BUTTON_OFFSET = BTN_SIZE
  18.  
  19. 'Appearance
  20. Const BTN_FLAT = 1
  21. Const BTN_3D = 2
  22.  
  23. '3D button res file images
  24. Const IDB_BTN3DTRUE = 100
  25. Const IDB_BTN3DFALSE = 101
  26. Const IDB_BTN3DTRUE_FOCUS = 102
  27. Const IDB_BTN3DFALSE_FOCUS = 103
  28.  
  29. 'Normal res file button images
  30. Const IDB_BTNTRUE = 105
  31. Const IDB_BTNFALSE = 106
  32. Const IDB_BTNTRUE_FOCUS = 107
  33. Const IDB_BTNFALSE_FOCUS = 108
  34.  
  35. 'Picturebox that is used as container
  36. Private m_picContainer As PictureBox
  37.  
  38. '*************************************
  39. ' Properties
  40. '*************************************
  41. 'Number of buttons in container
  42. Private m_Buttons As Byte
  43.  
  44. 'Space between each button
  45. Private m_ButtonOffset As Integer
  46.  
  47. 'Button that currently is selected in
  48. 'group; 0 = None
  49. Private m_Value As Byte
  50.  
  51. 'Appearance of buttons; 3D or FLAT
  52. Private m_Appearance As Byte
  53. Private Function ButtonHit%(X%, Y%)
  54.     Dim i%
  55.     Dim offset%
  56.     Dim BtnSizeX%
  57.     Dim BtnSizeY%
  58.     Dim rc As RECT
  59.     #If Win16 Then
  60.         'Must be integer for 16 bit
  61.         Dim X1%
  62.         Dim Y1%
  63.     #ElseIf Win32 Then
  64.         'Must be long for 32 bit
  65.         Dim X1&
  66.         Dim Y1&
  67.     #End If
  68.     
  69.     X1 = X
  70.     Y1 = Y
  71.     
  72.     'PtInRect, works faster in pixels than it twips.
  73.     offset% = m_ButtonOffset% / Screen.TwipsPerPixelX
  74.     BtnSizeX% = BTN_SIZE / Screen.TwipsPerPixelX
  75.     BtnSizeY% = BTN_SIZE / Screen.TwipsPerPixelY
  76.     
  77.     'This demo/class does not support a custom top property
  78.     'for each button; therefore the top of all buttons
  79.     'is zero -- the top of the container -- and the
  80.     'bottom is always the same for each button.
  81.     rc.Top = 0
  82.     rc.Bottom = BtnSizeY%
  83.     
  84.     For i% = 1 To m_Buttons
  85.         'Calculate the left and width of each button; the
  86.         'top and height are the same for each button and
  87.         'do not need to be recalculated.
  88.         rc.Left = (i% - 1) * offset%
  89.         rc.Right = rc.Left + BtnSizeX%
  90.         
  91.         'Test for a hit in the rect; if so,
  92.         'then return the button value and exit
  93.         #If Win16 Then
  94.             'Parameters must be in order of Y, X
  95.             'which is opposite to Win32
  96.             If PtInRect(rc, Y1, X1) Then
  97.                 ButtonHit% = i%
  98.                 Exit Function
  99.             End If
  100.         #ElseIf Win32 Then
  101.             'Parameters must be in order of X, Y
  102.             'which is opposite to Win16
  103.             If PtInRect(rc, X1, Y1) Then
  104.                 ButtonHit% = i%
  105.                 Exit Function
  106.             End If
  107.         #End If
  108.     Next i%
  109.     ButtonHit% = 0
  110. End Function
  111.  
  112.  
  113. Public Function InitializeClass(pic As PictureBox) As Boolean
  114.     'The VB implementation of the Class_Initialize
  115.     'event does not allow for the passing of parameters;
  116.     'therefore we must use a 'custom' initialize event.
  117.     
  118.     'Trap errors and return false if any
  119.     On Error GoTo InitERR:
  120.     
  121.     'Assig the passed picturebox to the private
  122.     'class picturebox variable.  This allows the
  123.     'class code to be self-contained/generic to the
  124.     'class itself; as the implementation of the class
  125.     'focuses on acting upon the container this variable
  126.     'must be set before any other methods/properties
  127.     'can be used.
  128.     Set m_picContainer = pic
  129.     
  130.     'The default appearance implementation is 3D.  By
  131.     'setting the property here it will cause the button/
  132.     'container to be originally shown as 3D.  This only
  133.     'makes a difference when the class is initialized after
  134.     'the form has loaded.  If the class is initialized in
  135.     'the form load event then it has no bearing on the
  136.     'acutal appearance as the programmer can reset the
  137.     'apperance in code before the user sees the form painted
  138.     '(as per this demo -- see the Form_Load event for details).
  139.     Appearance() = BTN_3D
  140.     
  141.     'Success
  142.     InitializeClass = True
  143. Exit Function
  144. InitERR:
  145.     'Indicate initialization failure
  146.     InitializeClass = False
  147.     Exit Function
  148. End Function
  149. Public Sub KeyDown(KeyCode As Integer, Shift As Integer)
  150.     'Allow the user to select the current
  151.     'button by moving through the group using
  152.     'the direction keys; this has the same
  153.     'effect as per normal option buttons.
  154.     
  155.     Select Case KeyCode
  156.     Case vbKeyLeft, vbKeyUp
  157.         Select Case m_Value
  158.         Case 0
  159.             Value() = 1
  160.         Case 1
  161.             Value() = m_Buttons
  162.         Case Else
  163.             Value() = m_Value - 1
  164.         End Select
  165.     Case vbKeyDown, vbKeyRight
  166.         Select Case m_Value
  167.         Case 0
  168.             Value() = 1
  169.         Case m_Buttons
  170.             Value() = 1
  171.         Case Else
  172.             Value() = m_Value + 1
  173.         End Select
  174.     End Select
  175. End Sub
  176.  
  177.  
  178. Public Sub MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  179.     Dim BtnHit%
  180.     
  181.     'Only proccess the "Hit" if the left mouse button
  182.     'is pressed by itself.
  183.     If (Button <> vbLeftButton) And (Shift <> 0) Then Exit Sub
  184.     
  185.     'Check for a mouse hit on a button
  186.     BtnHit% = ButtonHit%(X / Screen.TwipsPerPixelX, Y / Screen.TwipsPerPixelY)
  187.         
  188.     'If a button was hit then set that button
  189.     'as the currently selected button
  190.     Select Case BtnHit%
  191.     Case 1 To m_Buttons
  192.         Value() = BtnHit%
  193.     End Select
  194. End Sub
  195.  
  196. Public Sub Refresh()
  197.     Dim i%
  198.     Dim btnT%
  199.     Dim btnTF%
  200.     Dim btnF%
  201.     Dim btnFF%
  202.     
  203.     'The button images/bmps used to draw the
  204.     'buttons are stored in a *.res file.
  205.     'In this demo, there are only two sets of
  206.     'images; 3D or FLAT with or without focus.
  207.     
  208.     'If you want greater flexibility in how the buttons
  209.     'appear, then you could substitute the res file button
  210.     'image for graphics methods (i.e. Cirle, etc) or
  211.     'store more bitmaps in the res file.
  212.     
  213.     'By using procedure level variables in the actual
  214.     'code that draws the buttons, we can use the same code
  215.     'to draw the buttons for each different appearance.
  216.     'This is done by assigning the appropriate res file
  217.     'index values according to the desired button group
  218.     'we want (in this demo there are only two but in
  219.     'reality there could be more).
  220.     Select Case m_Appearance
  221.     Case BTN_3D
  222.         btnT% = IDB_BTN3DTRUE
  223.         btnTF% = IDB_BTN3DTRUE_FOCUS
  224.         btnF% = IDB_BTN3DFALSE
  225.         btnFF% = IDB_BTN3DFALSE_FOCUS
  226.     Case BTN_FLAT
  227.         btnT% = IDB_BTNTRUE
  228.         btnTF% = IDB_BTNTRUE_FOCUS
  229.         btnF% = IDB_BTNFALSE
  230.         btnFF% = IDB_BTNFALSE_FOCUS
  231.     End Select
  232.     
  233.     'If a *.res file is not available, then you could store
  234.     'the button pictures in image controls and use the
  235.     'Picture property as the source for PaintPicture, i.e.
  236.     'm_picContainer.PaintPicture Form1.imgBtn3dTrue.Picture, ...etc
  237.     
  238.     For i% = 1 To m_Buttons
  239.         If i% = m_Value Then
  240.             'We can determine if the picturebox has the focus
  241.             'by checking if the parent activecontrol is the
  242.             'picturebox.
  243.             If m_picContainer Is m_picContainer.Parent.ActiveControl Then
  244.                 'Button is selected, with focus
  245.                 m_picContainer.PaintPicture _
  246.                     LoadResPicture(btnTF%, vbResBitmap), _
  247.                     (i% - 1) * m_ButtonOffset, 0
  248.             Else
  249.                 'Button is selected, without focus
  250.                 m_picContainer.PaintPicture _
  251.                     LoadResPicture(btnT%, vbResBitmap), _
  252.                     (i% - 1) * m_ButtonOffset, 0
  253.             End If
  254.         Else
  255.             'Button is not selected, without focus
  256.             m_picContainer.PaintPicture _
  257.                 LoadResPicture(btnF%, vbResBitmap), _
  258.                 (i% - 1) * m_ButtonOffset, 0
  259.         End If
  260.     Next i%
  261.     
  262.     If m_Value = 0 Then
  263.         If m_picContainer Is m_picContainer.Parent.ActiveControl Then
  264.             'Button is not selected, with focus
  265.             m_picContainer.PaintPicture _
  266.                 LoadResPicture(btnFF%, vbResBitmap), 0, 0
  267.         End If
  268.     End If
  269. End Sub
  270.  
  271. Private Sub Class_Initialize()
  272.     m_Buttons = 1
  273.     m_ButtonOffset = 240
  274. End Sub
  275.  
  276. Private Sub Class_Terminate()
  277.     Set m_picContainer = Nothing
  278. End Sub
  279.  
  280.  
  281. Public Property Get Buttons() As Byte
  282.     Buttons = m_Buttons
  283. End Property
  284.  
  285. Public Property Let Buttons(NewValue As Byte)
  286.     Select Case NewValue
  287.     Case 1 To MAX_BUTTONS
  288.         m_Buttons = NewValue
  289.         Refresh
  290.     Case Else
  291.         MsgBox "Invalid property setting: Buttons = " & NewValue
  292.     End Select
  293. End Property
  294.  
  295. Public Property Get ButtonOffset() As Integer
  296.     ButtonOffset = m_ButtonOffset
  297. End Property
  298.  
  299.  
  300. Public Property Let ButtonOffset(NewValue As Integer)
  301.     Select Case NewValue
  302.     Case Is >= MIN_BUTTON_OFFSET
  303.         m_ButtonOffset = NewValue
  304.         Refresh
  305.     Case Else
  306.         MsgBox "Invalid property setting: ButtonOffset = " & NewValue
  307.     End Select
  308. End Property
  309.  
  310.  
  311. Public Property Get Value() As Byte
  312.     Value = m_Value
  313. End Property
  314.  
  315. Public Property Let Value(NewValue As Byte)
  316.     Select Case NewValue
  317.     Case 0 To m_Buttons
  318.         m_Value = NewValue
  319.         Refresh
  320.     Case Else
  321.         MsgBox "Invalid property setting: Value = " & NewValue
  322.     End Select
  323. End Property
  324.  
  325. Public Property Get Appearance() As Byte
  326.     Appearance = m_Appearance
  327. End Property
  328.  
  329. Public Property Let Appearance(NewValue As Byte)
  330.     'This color is hardcoded into the procedure
  331.     'vice using vbButtonFace because the bitmaps
  332.     'used for the buttons were created with this
  333.     'color value of light grey.
  334.     Const LT_GRAY = &HC0C0C0
  335.     
  336.     Select Case NewValue
  337.     Case BTN_FLAT, BTN_3D
  338.         If m_Appearance <> NewValue Then
  339.             m_Appearance = NewValue
  340.             Select Case m_Appearance
  341.             Case BTN_3D
  342.                 m_picContainer.BackColor = LT_GRAY
  343.             Case BTN_FLAT
  344.                 m_picContainer.BackColor = vbWhite
  345.             End Select
  346.             Refresh
  347.         End If
  348.     Case Else
  349.         MsgBox "Invalid property setting: Appearance = " & NewValue
  350.     End Select
  351. End Property
  352.  
  353.  
  354.